{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DQN - Deep Q-Network  (TensorFlow) - Play Atari game.\n",
    "\n",
    "In this notebook, we will use DQN with **experience replay** and **target networks** from `listing6_1` to train the agent to play Atari game. Most of the implementation will be same as previous one except some pre-processing to make Atari game playing trainable with DQN. \n",
    "\n",
    "The deep learning approach combined with Q-Learinng and word `DQN` was coined in this paper. We have tried to broadly follow the steps of the paper in this notebook\n",
    "\n",
    "Paper: [Playing Atari with Deep Reinforcement Learning](https://arxiv.org/pdf/1312.5602.pdf)\n",
    "\n",
    "### Recap from last notebook\n",
    "\n",
    "$$ \n",
    "\\DeclareMathOperator*{\\max}{max}$$\n",
    "\n",
    "Q Learning control is carried out by sampling step by step and updating Q values at each step. We use ε-greedy policy to explore and generate samples. However, the policy learnt is a deterministic greedy policy with no exploration. We can carryout updates online i.e. we take a step and use `(current state, action, reward and next_state)` tuple to update. \n",
    "\n",
    "In case of function approximation using neural network, the input to the network is the state and output is the q(s,a) for all the actions in the state `s`. It is denoted as $ \\hat{q}(s_t,a; w_{t}) $, where $w_{t}$ is the weigths of the neural network which we are trying to learn as part of DQN learning. \n",
    "\n",
    "We use two networks, one target network to get the max q-value of next state denoted by $ \\max_a \\hat {q}(s_{t+1},a; w^{-}_{t}) $ and the primary network with weights $w_{t}$ which we are updated based on back propagation of the TD error through the network.\n",
    "\n",
    "The Update equation is given below. This is the online version:\n",
    "$$ w_{t+1} \\leftarrow w_t + \\alpha [ R_{t+1} + \\gamma . \\max_{a} \\hat{q}(S_{t+1},a,w^{-}_{t}) – \\hat{q}(S_t,A_t,w_t)] \\nabla \\hat{q}(S_t,A_t,w_t)$$\n",
    "\n",
    "Online update with neural network with millions of weights does not work well. Accordingly, We use experience replay (aka Replay Buffer).  We use a behavior policy to explore the environment and store the samples `(s, a, r, s', done)` in a buffer. The samples are generated using an exploratory behavior policy while we improve a deterministic target policy using q-values. \n",
    "\n",
    "Therefore, we can always use older samples from behavior policy and apply them again and again. We can keep the buffer size fixed to some pre-determined size and keep deleting the older samples as we collect new ones. This process makes learning sample efficient by reusing a sample multiple times and also removing temporal dependence of the samples we would otherwise see while following a trajectory.\n",
    "\n",
    "The update equation with batch update with minor modifications is given below. We collect samples of transitions (current state, action, reward, next state) in a buffer. Where each sample is denoted as a tuple: \n",
    "\n",
    "$$ (s_{i}, a_{i}, r_{i}, s^{'}_{i}, done_{i})$$\n",
    "\n",
    "Subscript (i) denotes ith sample. We take N samples from experience replay selecting randomly and update the weights. Subscript (t) denotes the index of weight updates. If the current state is done, as denoted by `done` flag, the target is just the reward as terminal states have zero value. The final update equation is as given below:\n",
    "\n",
    "$$w_{t+1} \\leftarrow w_t + \\alpha \\frac{1}{N} \\sum_{i=1}^{N} \\left[ r_i + \\left( (1-done_i) . \\gamma .  \\max_{a^{'}_{i}} \\hat{q}(s_{i}^{'},a_{i}^{'};w^{-}_{t}) \\right) – \\hat{q}(s_i,a_i;w_t) \\right] \\nabla \\hat{q}(s_i,a_i;w_t)$$\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.layers import Dense, Flatten\n",
    "from tensorflow.keras import Model\n",
    "import gym\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.signal import convolve, gaussian\n",
    "\n",
    "import os\n",
    "import io\n",
    "import base64\n",
    "import time\n",
    "import glob\n",
    "from IPython.display import HTML\n",
    "\n",
    "%matplotlib inline\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Environment - Atari Breakout \n",
    "\n",
    "We can use the setup here to run on any environment which has state as a single vector and actions are discrete. We will build it on Atari Breakout.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_env(env_name, seed=None):\n",
    "    # remove time limit wrapper from environment\n",
    "    env = gym.make(env_name).unwrapped\n",
    "    if seed is not None:\n",
    "        env.seed(seed)\n",
    "    return env"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x648 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "env_name = \"BreakoutNoFrameskip-v4\"\n",
    "\n",
    "env = make_env(env_name)\n",
    "env.reset()\n",
    "\n",
    "\n",
    "\n",
    "n_cols = 4\n",
    "n_rows = 2\n",
    "fig = plt.figure(figsize=(16, 9))\n",
    "\n",
    "for row in range(n_rows):\n",
    "    for col in range(n_cols):\n",
    "        ax = fig.add_subplot(n_rows, n_cols, row * n_cols + col + 1)\n",
    "        ax.imshow(env.render('rgb_array'))\n",
    "        env.step(env.action_space.sample())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### We can play the game\n",
    "\n",
    "use `A` and `D` on keyboard to move the bat and `Space-bar` to start. use `Esc` to kill the game.\n",
    "\n",
    "**NOTE: Running the cell below may crash your kernel in Mac. If you face that problem, please comment the cell below or do not run it**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pygame 2.0.0 (SDL 2.0.12, python 3.8.5)\n",
      "Hello from the pygame community. https://www.pygame.org/contribute.html\n"
     ]
    }
   ],
   "source": [
    "from gym.utils.play import play\n",
    "\n",
    "play(env=gym.make(env_name), zoom=2, fps=30)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pre processing\n",
    "\n",
    "Atari images are 210x160x3 pixels but we will scale it down and also convert to gray-scale to reduce the size and make the game learn faster from smaller image sizes. We will also stack 4 last frames as input observation. This is done to capture the motion of the ball and bat which would not be visible in a single frame of game. OpenAI Gym library has ObservationWrappers to provide all these pre-processing out of the box. We will also be clipping rewards with just the sign of rewards. This is following the approach outlined in original paper. Let us build our preprocessor below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(84, 84, 4)\n"
     ]
    }
   ],
   "source": [
    "from gym.wrappers import AtariPreprocessing\n",
    "from gym.wrappers import FrameStack\n",
    "from gym.wrappers import TransformReward\n",
    "from gym.core import ObservationWrapper\n",
    "\n",
    "# in tensorflow imgs have shape [h, w, c] instead of torch imgs with shape [c, h, w]\n",
    "\n",
    "class SwapChannelWrapper(gym.ObservationWrapper):\n",
    "    def __init__(self, env):\n",
    "        gym.ObservationWrapper.__init__(self, env)\n",
    "\n",
    "        self.img_size = [self.observation_space.shape[i]\n",
    "                         for i in [1, 2, 0]\n",
    "                         ]\n",
    "        self.observation_space = gym.spaces.Box(0.0, 1.0, self.img_size)\n",
    "\n",
    "    def observation(self, img):\n",
    "        \"\"\"what happens to each observation\"\"\"\n",
    "        img = img[:].transpose(1, 2, 0) #we also remove the lazywrapper to swap the axis\n",
    "        return img\n",
    "\n",
    "def make_env(env_name, clip_rewards=True, seed=None):\n",
    "    env = gym.make(env_name)\n",
    "    if seed is not None:\n",
    "        env.seed(seed)\n",
    "    env = AtariPreprocessing(env, screen_size=84, scale_obs=True)\n",
    "    env = FrameStack(env, num_stack=4)\n",
    "    if clip_rewards:\n",
    "        env = TransformReward(env, lambda r: np.sign(r))\n",
    "    env = SwapChannelWrapper(env)\n",
    "    return env\n",
    "\n",
    "env = make_env(env_name)\n",
    "env.reset()\n",
    "n_actions = env.action_space.n\n",
    "state_shape = env.observation_space.shape\n",
    "print(state_shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000021463BA7580>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000021463E460D0>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000021463E460D0>\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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k8mQyWSYn59XxVI6kud5JBIJzIxcLtfU+laxWCSbzZJOp1lYWNA0FelIZhbsW7u4uNiUxvC2C878Sdh+y7/G+UunKhaLlEolyuVy0+eE+Ysk+PlIPWfSiTzPo1gsBnmomRXLSqWyohxqZgOKSLuoVqtBOdTshXX8kVCNN5FO5F/fzVrEUEvpi4iIiIiItIENB2dmFjaz75nZX9TvD5jZQ2Z2sv6zv3XJFBERERER6WyX03P2i8BzDfc/CjzsnDsAPFy/LyIiIiIiIldgQ8GZme0Ffhj4Lw0Pvw94sP77g8B9TU2ZiIiIiIjIDrLRnrP/APwq0LhqwYhz7gJA/eeu1f7QzB4ws2Nmdkx7lomIiIiIiKxu3eDMzN4DTDnnnriSN3DOfdI5d6dz7s6hoaErOYSIiIiIiEjH28hS+m8E3mtmPwTEgR4z++/ApJntds5dMLPdwFQrEyoiIiIiItLJ1u05c879S+fcXufcdcAHgb92zn0Y+BJwf/1l9wNfbFkqRUREREREOtxm9jn7GPAOMzsJvKN+X0RERERERK7ARoY1BpxzjwCP1H+fBe5tfpJERERERER2ns30nImIiIiIiEiTKDgTERERERFpAwrORERERERE2oCCMxERERERkTag4ExERERERKQNKDgTERERERFpAwrORERERERE2oCCMxERERERkTag4ExERERERKQNKDgTERERERFpAwrORERERERE2oCCMxERERERkTag4ExERERERKQNKDgTERERERFpAwrORERERERE2oCCMxERERERkTbgbeRFZnYayAIVoOycu9PMBoA/Aa4DTgM/7pybb00yRUREREREOtvl9Jz9gHPuqHPuzvr9jwIPO+cOAA/X74uIiIiIiMgV2MywxvcBD9Z/fxC4b9OpERERERER2aE2Gpw54Gtm9oSZPVB/bMQ5dwGg/nPXan9oZg+Y2TEzOzYzM7P5FIuIiIiIiHSgDc05A97onDtvZruAh8zs+Y2+gXPuk8AnAe644w53BWkUERERERHpeBvqOXPOna//nAK+ANwFTJrZboD6z6lWJVJERERERKTTrRucmVnKzLr934F3As8AXwLur7/sfuCLrUqkiIiIiIhIp9vIsMYR4Atm5r/+j51zXzWzx4HPmtlHgDPAB1qXTBERERERkc62bnDmnHsJeN0qj88C97YiUSIiIiIi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\n",
      "text/plain": [
       "<Figure size 1080x661 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for _ in range(12):\n",
    "    obs, _, _, _ = env.step(env.action_space.sample())\n",
    "\n",
    "plt.figure(figsize=[12,10])\n",
    "plt.title(\"Game image\")\n",
    "plt.imshow(env.render(\"rgb_array\"))\n",
    "plt.show()\n",
    "\n",
    "obs = np.transpose(obs,[0,2,1]) #move axes\n",
    "obs = obs.reshape((obs.shape[0], -1))\n",
    "\n",
    "\n",
    "plt.figure(figsize=[15,15])\n",
    "plt.title(\"Agent observation (4 frames left to right)\")\n",
    "plt.imshow(obs, cmap='gray')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Building a network using tensorflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let us build a DQN agent using the architecture suggested in paper.\n",
    "\n",
    "    Observation:\n",
    "        tensorflow 84x84x4 tensorflow has channels in the last dimension\n",
    "        input: [batch_size, 84, 84, 4]\n",
    "        1st hidden layer: 16 8x8 filters with stride 4 and RelU activation\n",
    "        2nd hidden layer: 32 4x4 filters with stride of 2 and RelU activation\n",
    "        3nd hidden layer: Linear layer with 256 outputs and RelU activatrion\n",
    "        output layer: Linear with n_actions units with no activation\n",
    "\n",
    "To build this network, after 2 layers of convolution, we will flatten the layers. To connect this to Dense(Linear) layer, we can calculate the number of units entering dense layer. We do so using the formula for Conv2D output. **We needed this for PyTorch but TensorFlow computes this internally and we do not need to provide the same explicitly.**\n",
    "\n",
    "`out_dim = (in_dim - (kernel_size - 1) - 1) // stride  + 1`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv2d_size_out(size, kernel_size, stride):\n",
    "    return (size - (kernel_size - 1) - 1) // stride  + 1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv1:  20\n",
      "Conv1:  9\n",
      "Input to Dense layer: 2592\n"
     ]
    }
   ],
   "source": [
    "# for the network above\n",
    "# 1st Conv layer output size\n",
    "conv1 = conv2d_size_out(84, 8, 4)\n",
    "print('Conv1: ', conv1)\n",
    "conv2 = conv2d_size_out(conv1, 4, 2)\n",
    "print('Conv1: ', conv2)\n",
    "\n",
    "#number of units entering dense layer would be\n",
    "print(\"Input to Dense layer:\", conv2*conv2*32) #32 is number of filters coming out in 2nd conv layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQNAgent:\n",
    "    def __init__(self, state_shape, n_actions, epsilon=0):\n",
    "\n",
    "        super().__init__()\n",
    "        self.epsilon = epsilon\n",
    "        self.n_actions = n_actions\n",
    "        self.state_shape = state_shape\n",
    "        \n",
    "        # a simple NN with state_dim as input vector (inout is state s)\n",
    "        # and self.n_actions as output vector of logits of q(s, a)\n",
    "        self.model = tf.keras.models.Sequential()\n",
    "        self.model.add(tf.keras.Input(shape=state_shape))\n",
    "        self.model.add(tf.keras.layers.Conv2D(16, kernel_size=8, strides=4, activation='relu'))\n",
    "        self.model.add(tf.keras.layers.Conv2D(32, kernel_size=4, strides=2, activation='relu'))\n",
    "        self.model.add(tf.keras.layers.Flatten())\n",
    "        self.model.add(tf.keras.layers.Dense(256, activation='relu'))\n",
    "        self.model.add(tf.keras.layers.Dense(n_actions))\n",
    "        \n",
    "    def __call__(self, state_t):\n",
    "        # pass the state at time t through the newrok to get Q(s,a)\n",
    "        qvalues = self.model(state_t)\n",
    "        return qvalues\n",
    "\n",
    "    def get_qvalues(self, states):\n",
    "        # input is an array of states in numpy and outout is Qvals as numpy array\n",
    "        qvalues = self.model(states)\n",
    "        return qvalues.numpy()\n",
    "\n",
    "    def sample_actions(self, qvalues):\n",
    "        # sample actions from a batch of q_values using epsilon greedy policy\n",
    "        epsilon = self.epsilon\n",
    "        batch_size, n_actions = qvalues.shape\n",
    "        random_actions = np.random.choice(n_actions, size=batch_size)\n",
    "        best_actions = qvalues.argmax(axis=-1)\n",
    "        should_explore = np.random.choice(\n",
    "            [0, 1], batch_size, p=[1-epsilon, epsilon])\n",
    "        return np.where(should_explore, random_actions, best_actions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "agent = DQNAgent(state_shape, n_actions, epsilon=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 20, 20, 16)        4112      \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 9, 9, 32)          8224      \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 2592)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 256)               663808    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 4)                 1028      \n",
      "=================================================================\n",
      "Total params: 677,172\n",
      "Trainable params: 677,172\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "agent.model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate(env, agent, n_games=1, greedy=False, t_max=10000):\n",
    "    rewards = []\n",
    "    for _ in range(n_games):\n",
    "        s = env.reset()\n",
    "        reward = 0\n",
    "        for _ in range(t_max):\n",
    "            qvalues = agent.get_qvalues(np.array([s]))\n",
    "            action = qvalues.argmax(axis=-1)[0] if greedy else agent.sample_actions(qvalues)[0]\n",
    "            s, r, done, _ = env.step(action)\n",
    "            reward += r\n",
    "            if done:\n",
    "                break\n",
    "\n",
    "        rewards.append(reward)\n",
    "    return np.mean(rewards)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluate(env, agent, n_games=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "env.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Experience replay\n",
    "\n",
    "We will use the replay buffer we saw in chapter 4 listings. Replay buffer is very important in DQN to break the correlation between samples. We use a behavior policy ($\\epsilon-greedy$) to sample from the environment and store the transitions (s,a,r,s',done) into a buffer. These samples are used multiple times in a learning making the process sample efficient. \n",
    "\n",
    "The interface to ReplayBuffer is:\n",
    "* `exp_replay.add(state, action, reward, next_state, done)` - saves (s,a,r,s',done) tuple into the buffer\n",
    "* `exp_replay.sample(batch_size)` - returns states, actions, rewards, next_states and done_flags for `batch_size` random samples.\n",
    "* `len(exp_replay)` - returns number of elements stored in replay buffer.\n",
    "\n",
    "We have modified the implementation a bit to make it more efficient"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ReplayBuffer:\n",
    "    def __init__(self, size):\n",
    "        self.size = size #max number of items in buffer\n",
    "        self.buffer =[] #array to holde buffer\n",
    "        self.next_id = 0\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.buffer)\n",
    "    \n",
    "    def add(self, state, action, reward, next_state, done):\n",
    "        item = (state, action, reward, next_state, done)\n",
    "        if len(self.buffer) < self.size:\n",
    "           self.buffer.append(item)\n",
    "        else:\n",
    "            self.buffer[self.next_id] = item\n",
    "        self.next_id = (self.next_id + 1) % self.size\n",
    "        \n",
    "    def sample(self, batch_size):\n",
    "        idxs = np.random.choice(len(self.buffer), batch_size)\n",
    "        samples = [self.buffer[i] for i in idxs]\n",
    "        states, actions, rewards, next_states, done_flags = list(zip(*samples))\n",
    "        return np.array(states), np.array(actions), np.array(rewards), np.array(next_states), np.array(done_flags)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def play_and_record(start_state, agent, env, exp_replay, n_steps=1):\n",
    "\n",
    "    s = start_state\n",
    "    sum_rewards = 0\n",
    "\n",
    "    # Play the game for n_steps and record transitions in buffer\n",
    "    for _ in range(n_steps):\n",
    "        qvalues = agent.get_qvalues(np.array([s]))\n",
    "        a = agent.sample_actions(qvalues)[0]        \n",
    "        next_s, r, done, _ = env.step(a)\n",
    "        sum_rewards += r\n",
    "        exp_replay.add(s, a, r, next_s, done)\n",
    "        if done:\n",
    "            s = env.reset()\n",
    "        else:\n",
    "            s = next_s\n",
    "        \n",
    "    return sum_rewards, s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Target network\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_network = DQNAgent(agent.state_shape, agent.n_actions, epsilon=0.5)\n",
    "target_network.model.set_weights(agent.model.get_weights())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Learning with... Q-learning\n",
    "Here we write a function similar to tabular q-learning. We will calculate average TD error per batch using the equation: \n",
    "\n",
    "$$ L =  \\frac{1}{N} \\sum_{i=1}^{N} \\left[ r_i + \\left( (1-done_i) . \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t}) \\right) – \\hat{q}(s_i,a_i;w_t) \\right]^2$$\n",
    "\n",
    "\n",
    "$$ \\nabla_w L =   - \\frac{1}{N} \\sum_{i=1}^{N} \\left[ r_i + \\left( (1-done_i) . \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t}) \\right) – \\hat{q}(s_i,a_i;w_t) \\right] \\nabla \\hat{q}(s_i,a_i;w_t)$$\n",
    "\n",
    "\n",
    "$\\hat{q}(s',A;w^{-})$ is calculated using target network whose weights are held constant and refreshed periodically from the agent learning network. \n",
    "\n",
    "Target is given by following:\n",
    "* non terminal state: $r_i +  \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t})$\n",
    "* terminal state: $ r_i $\n",
    "\n",
    "We then carryout back propagation through the agent network to update the weights using equation below:\n",
    "\n",
    "\n",
    "$$ \n",
    "\\DeclareMathOperator*{\\max}{max} w_{t+1} \\leftarrow w_t - \\alpha \\nabla_{w}L$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_td_loss(agent, target_network, states, actions, rewards, next_states, done_flags,\n",
    "                    gamma=0.99):\n",
    "\n",
    "    # get q-values for all actions in current states\n",
    "    # use agent network\n",
    "    predicted_qvalues = agent(states)\n",
    "\n",
    "    # compute q-values for all actions in next states\n",
    "    # use target network\n",
    "    predicted_next_qvalues = target_network(next_states)\n",
    "    \n",
    "    # select q-values for chosen actions\n",
    "    row_indices= tf.range(len(actions))\n",
    "    indices = tf.transpose([row_indices, actions])\n",
    "    predicted_qvalues_for_actions = tf.gather_nd(predicted_qvalues, indices)\n",
    "    \n",
    "\n",
    "    # compute Qmax(next_states, actions) using predicted next q-values\n",
    "    next_state_values = tf.reduce_max(predicted_next_qvalues, axis=1)\n",
    "\n",
    "    # compute \"target q-values\" \n",
    "    target_qvalues_for_actions = rewards + gamma * next_state_values * (1-done_flags)\n",
    "\n",
    "    # mean squared error loss to minimize\n",
    "    loss = tf.keras.losses.MSE(target_qvalues_for_actions, predicted_qvalues_for_actions)\n",
    "\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Main loop\n",
    "\n",
    "We now carryout the training on DQN setup above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm import trange\n",
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# set a seed\n",
    "seed = 13\n",
    "random.seed(seed)\n",
    "np.random.seed(seed)\n",
    "tf.random.set_seed(seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "#setup env and agent and target networks\n",
    "env = make_env(env_name, seed)\n",
    "state_dim = env.observation_space.shape\n",
    "n_actions = env.action_space.n\n",
    "state = env.reset()\n",
    "\n",
    "agent = DQNAgent(state_dim, n_actions, epsilon=1)\n",
    "target_network = DQNAgent(state_dim, n_actions, epsilon=1)\n",
    "target_network.model.set_weights(agent.model.get_weights())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000\n"
     ]
    }
   ],
   "source": [
    "# let us fill experience replay with some samples using full random policy\n",
    "exp_replay = ReplayBuffer(10**4)\n",
    "for i in range(100):\n",
    "    play_and_record(state, agent, env, exp_replay, n_steps=10**2)\n",
    "    if len(exp_replay) == 10**4:\n",
    "        break\n",
    "print(len(exp_replay))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#setup some parameters for training\n",
    "timesteps_per_epoch = 1\n",
    "batch_size = 32\n",
    "\n",
    "total_steps = 100\n",
    "# total_steps = 3 * 10**6\n",
    "# We will train only for a sample of 100 steps\n",
    "# To train the full network on a CPU will take hours.\n",
    "# infact even GPU training will be fiarly long\n",
    "# Those who have access to powerful machines with GPU could \n",
    "# try training it over 3-5 million steps or so\n",
    "\n",
    "\n",
    "#init Optimizer\n",
    "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)\n",
    "\n",
    "# set exploration epsilon \n",
    "start_epsilon = 1\n",
    "end_epsilon = 0.05\n",
    "eps_decay_final_step = 1 * 10**6\n",
    "\n",
    "# setup spme frequency for loggind and updating target network\n",
    "loss_freq = 20\n",
    "refresh_target_network_freq = 100\n",
    "eval_freq = 1000\n",
    "\n",
    "# to clip the gradients\n",
    "max_grad_norm = 5000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "mean_rw_history = []\n",
    "td_loss_history = []\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def epsilon_schedule(start_eps, end_eps, step, final_step):\n",
    "    return start_eps + (end_eps-start_eps)*min(step, final_step)/final_step\n",
    "\n",
    "def smoothen(values):\n",
    "    kernel = gaussian(100, std=100)\n",
    "    kernel = kernel / np.sum(kernel)\n",
    "    return convolve(values, kernel, 'valid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  3%|██▍                                                                               | 3/101 [00:07<08:30,  5.21s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "buffer size = 10000, epsilon = 1.00000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████| 101/101 [00:13<00:00,  7.31it/s]\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x000002143428C520>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x000002143428C520>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x000002143428C520>\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "state = env.reset()\n",
    "for step in trange(total_steps + 1):\n",
    "    \n",
    "    # reduce exploration as we progress\n",
    "    agent.epsilon = epsilon_schedule(start_epsilon, end_epsilon, step, eps_decay_final_step)\n",
    "\n",
    "    # take timesteps_per_epoch and update experience replay buffer\n",
    "    _, state = play_and_record(state, agent, env, exp_replay, timesteps_per_epoch)\n",
    "\n",
    "    # train by sampling batch_size of data from experience replay\n",
    "    states, actions, rewards, next_states, done_flags = exp_replay.sample(batch_size)\n",
    "    \n",
    "    with tf.GradientTape() as tape:\n",
    "        # loss = <compute TD loss>\n",
    "        loss = compute_td_loss(agent, target_network, \n",
    "                               states, actions, rewards, next_states, done_flags,                  \n",
    "                               gamma=0.99)\n",
    "\n",
    "    gradients = tape.gradient(loss, agent.model.trainable_variables)\n",
    "    clipped_grads = [tf.clip_by_norm(g, max_grad_norm) for g in gradients]\n",
    "    optimizer.apply_gradients(zip(clipped_grads, agent.model.trainable_variables))\n",
    "\n",
    "\n",
    "    if step % loss_freq == 0:\n",
    "        td_loss_history.append(loss.numpy())\n",
    "\n",
    "    if step % refresh_target_network_freq == 0:\n",
    "        # Load agent weights into target_network\n",
    "        target_network.model.set_weights(agent.model.get_weights())\n",
    "\n",
    "    if step % eval_freq == 0:\n",
    "        # eval the agent\n",
    "        mean_rw_history.append(evaluate(\n",
    "            make_env(env_name, seed=step), agent, n_games=3, greedy=True, t_max=1000)\n",
    "        )\n",
    "\n",
    "        clear_output(True)\n",
    "        print(\"buffer size = %i, epsilon = %.5f\" %\n",
    "              (len(exp_replay), agent.epsilon))\n",
    "\n",
    "        plt.figure(figsize=[16, 5])\n",
    "        plt.subplot(1, 2, 1)\n",
    "        plt.title(\"Mean reward per episode\")\n",
    "        plt.plot(mean_rw_history)\n",
    "        plt.grid()\n",
    "\n",
    "        assert not np.isnan(td_loss_history[-1])\n",
    "        plt.subplot(1, 2, 2)\n",
    "        plt.title(\"TD loss history (smoothened)\")\n",
    "        plt.plot(smoothen(td_loss_history))\n",
    "        plt.grid()\n",
    "\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "final score: 0.0\n"
     ]
    }
   ],
   "source": [
    "final_score = evaluate(\n",
    "  make_env(env_name),\n",
    "  agent, n_games=1, greedy=True, t_max=1000\n",
    ")\n",
    "print('final score:', final_score)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The training for 100 steps will not produce any result. It may be close to 100,000 steps or so before you see any semblance of learning by agent. Do not worry about any exceptions you may get above. That is because the first graph has no data point for 100 steps. First data point for the left graph is generated only at 1000th step."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Let us record a video of trained agent**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_animation(env, agent, save_dir):\n",
    "    \n",
    "    try:\n",
    "        env = gym.wrappers.Monitor(\n",
    "            env, save_dir, video_callable=lambda id: True, force=True, mode='evaluation')\n",
    "    except gym.error.Error as e:\n",
    "        print(e)\n",
    "\n",
    "    if not os.path.exists(save_dir):\n",
    "        os.makedirs(save_dir)\n",
    "        \n",
    "    state = env.reset()\n",
    "    print(\"initial shape:\", state.shape)\n",
    "    reward = 0\n",
    "    t = 0\n",
    "    while True:\n",
    "        qvalues = agent.get_qvalues(np.array([state]))\n",
    "        action = qvalues.argmax(axis=-1)[0]\n",
    "        state, r, done, _ = env.step(action)\n",
    "        reward += r\n",
    "        t += 1\n",
    "        if done or t >=1000:\n",
    "            print('Got reward: {}'.format(reward))\n",
    "            break\n",
    "            \n",
    "def display_animation(filepath):\n",
    "    video = io.open(filepath, 'r+b').read()\n",
    "    encoded = base64.b64encode(video)\n",
    "    return HTML(data='''<video alt=\"test\" controls>\n",
    "                <source src=\"data:video/mp4;base64,{0}\" type=\"video/mp4\" />\n",
    "                 </video>'''.format(encoded.decode('ascii')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "initial shape: (84, 84, 4)\n",
      "Got reward: 0.0\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<video alt=\"test\" controls>\n",
       "                <source src=\"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAT8BtZGF0AAACoAYF//+c3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMjAgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0xIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDM6MHgxMTMgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTEgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz03IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAhZliIQAM//+9uy+BTYUyFBlecO0whoBCYEnc7MnJFd0u+w5vAINZh+eqRtNYlH6Khib0gZaRg1CR65tV7MSxBFgqVE2ZlFJo77wmAYBqIpK8NvrLGCygcSwcS9PmRN6IqBSbmoXYDws1XSu6In4VMh7ptcvh/59SMX2anuUOmv6gfNIjlswVzmZOYaTRCemCPB7auWHMfn0rcEeDCW472vM4EmjCPJjhjQxDeNTOQ0kdW9TtsFDAm8JRmVZSeqDcUyV6jksQpDu1mXuFJru947hQRhrILc71zA7P1W7Vt65QkPJO5FKlcNABIrG4Ho+Kp0f1P3y2dttmIvIecHDY0tDv1vrQx7CkxfgFHdBanEVjf8+0X6le38zftLOLMPKgKJBLjCUFsIaLopd0O3nNA8aL+5WRdGWaZkT43qkjXaxJHxmJQ/OvlfYItHDSN0EWg3HNORaVw+vsafROJHgigRmBsOT4HbRyFR5DDBZKfJCKLAzEPg5B/oZ3VW6YUeqYwZ32744ncdbCqUI8jP+WOsGFl4M0O948xz2Gk6wKrL0BbTW8solxFdWYYyWEAq7Jjg+ziv9UR1G/4H3bwIDAoDnMepIzPDTkemEIbWDi1DodXwwlSMJs7ALQ8K/8l76bt6HmKMaJ3sWH16nCo2zy7JhFTedEwi9i9AXOcE3YaTAgaowNxJQNJ6h18uXc8dvB5nuUQj1CXkAAACvQZokbEK//jhAK1ErEDIDKM5RBVtjR1I7wiZX4e9YOCj4mytt13MF7tXyPS8WyuuaWWgg4k/1FzuAiXyaRXSt+HeHj7dRdCnpTeiOHzJ2V4dM1pAEN9zJmj+4J+CPJ9kjrLVpHrEj1yD4QaPApMBiJ/1WDKGC+vgoIok1GYN7vlsrVYxqU8yHUKBu3zauBY3C4blt+QJely/vymU/Cc+lg0foXaCCVMAFn/4EI6EWEgAAAFlBnkJ4hX8BsTrNvqArOVq+ri2ca+AD91RE41S3RgNfFLllA4WGZI001Eb/n/SmGncv7buzizgGJOZNQqWhOiWDDLddPHCooKeOMbbjc7hyY6GojHPfwPxn9wAAABcBnmF0Qn8AbCXuzg/YiRXkUEUyMsDkwAAAAFMBnmNqQn8AdB14NwMzokAHFnTw0BrT+SUj4UQnG0mPu4kRo4pa962m5CTAQ4b3zGNqy1/lnLpH1+kBDmM7KJECOVcLVooOBp6tubNGN0NqwpEVSwAAAG1BmmhJqEFomUwIb//+p4QC7diiAFoelHwDXyhRmBnxI4hbNg8CwXBRQAAOT/9hNC9TJxKRL03Sg6QrWCP0TwHgif6n2SCEOTc+Kzlqnh0wH5skqZ9AAnukIrALoZFbMPW7tCgOlv770O5Irj91AAAAEUGehkURLCv/AF0f6H2JDTfBAAAADwGepXRCfwB2u7FpgzmooQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAAkQZu8SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0Gf2kUVLCv/ACthAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAAkQZvgSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oAAAAAkBnj9qQn8AN6EAAAAkQZokSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeQkUVLCv/ACthAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAAkQZpoSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GehkUVLCv/ACthAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAAkQZqsSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6AAAAAkQZrwSahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAAkQZs0SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOeAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6AAAAAkQZt4SahBbJlMCG///qeEAu3YogBaHpR8A18oUZgZ8SOIWzOfAAAAC0GflkUVLCv/ACtgAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAARQZu5SahBbJlMCE///fEAB6QAAAH2ZYiCAAQ//veBvzLLZD+qxl/aQhpDAAOnC++oUp5Pvb1jT4GOECC9SpnxEaL74nc4kyCAsTDB9VWkhZItS2rxwW3FTQkPKEtgewvT9T5EvNZ9G4B0wIHsVRjk3M5BthLFgt197N3trIuk0CaUGRwALYQn58nVKUwLnQwf9wdQER++qEgQHykV+rMrC9nKM3msgtEYCcHdZ8rJ619fPo4xeCT0EC0V29psqW+Ynd5ZOxynjTghp+M059Uf6julJS7bA0yxlo8+zeteMoUwLDVm83AwaPILBS8+QnDledbH2UOue6mZDciV41tWmysuABMUv22fgV/b3yVSnfqUUQiD5MW5Pj4jlJpGxkCaOK7YWBfNQ0pKliYAAGNEU/G6bZJ3a1kUSyOJoErcxVEXEqtu7RHoiNFkq0s8RIjPK6G6ptntY72BvSnccxDQWsSQAmr/aDSZM3DoF8scNaG2Dqe2a33zq+KWzf7ujKitdkHck2r/Mx41StECeFTObM+Fx0LbGIGNAqr3j2qXu1RUdKC8BfA3Vg/8e0Rvaqdfh6kLF/7uSGYf5IoMAFq7U6cfSBPVE3u3Gio4Nym9l0hB4RyN0mPKz+IVMTi5eUdwBfGPbE1DdSmv+67sMIdLYqeInTDMZgtW6/TPwCzitf24ZaW1af++uy+ICQAAAB1BmiRsQ3/+p4QDHN2TSUieWDWICgiNgBef9rwR/gAAAA1BnkJ4hX8BsTrGaXFTAAAACwGeYXRCfwBJWkZhAAAACQGeY2pCfwA3oAAAABJBmmhJqEFomUwIb//+p4QANSAAAAALQZ6GRREsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABJBm7xJqEFsmUwIb//+p4QANSAAAAALQZ/aRRUsK/8AK2AAAAAJAZ/5dEJ/ADehAAAACQGf+2pCfwA3oAAAABJBm+BJqEFsmUwIb//+p4QANSEAAAALQZ4eRRUsK/8AK2EAAAAJAZ49dEJ/ADegAAAACQGeP2pCfwA3oQAAABJBmiRJqEFsmUwIb//+p4QANSAAAAALQZ5CRRUsK/8AK2EAAAAJAZ5hdEJ/ADehAAAACQGeY2pCfwA3oAAAABJBmmhJqEFsmUwIb//+p4QANSAAAAALQZ6GRRUsK/8AK2EAAAAJAZ6ldEJ/ADegAAAACQGep2pCfwA3oQAAABJBmqxJqEFsmUwIb//+p4QANSAAAAALQZ7KRRUsK/8AK2EAAAAJAZ7pdEJ/ADehAAAACQGe62pCfwA3oQAAABJBmvBJqEFsmUwIb//+p4QANSEAAAALQZ8ORRUsK/8AK2AAAAAJAZ8tdEJ/ADegAAAACQGfL2pCfwA3oQAAABJBmzRJqEFsmUwIb//+p4QANSAAAAALQZ9SRRUsK/8AK2AAAAAJAZ9xdEJ/ADehAAAACQGfc2pCfwA3oQAAABJBm3hJqEFsmUwIb//+p4QANSEAAAALQZ+WRRUsK/8AK2AAAAAJAZ+1dEJ/ADegAAAACQGft2pCfwA3oQAAABFBm7lJqEFsmUwIT//98QAHpAAAAfZliIQAEP/+94G/MstkP6rGX9pCGkMAA6cL76hSnk+9vWNPgY4QIL1KmfERovvidziTIICxMMH1VaSFki1LavHBbcVNCQ8oS2B7C9P1PkS81n0bgHTAgexVGOTczkG2EsWC3X3s3e2si6TQJpQZHAAthCfnydUpTAudDB/3B1ARH76oSBAfKRX6sysL2cozeayC0RgJwd1nysnrX18+jjF4JPQQLRXb2mypb5id3lk7HKeNOCGn4zTn1R/qO6UlLtsDTLGWjz7N614yhTAsNWbzcDBo8gsFLz5CcOV51sfZQ657qZkNyJXjW1abKy4AExS/bZ+BX9vfJVKd+pRRCIPkxbk+PiOUmkbGQJo4rthYF81DSkqWJgAAY0RT8bptkndrWRRLI4mgStzFURcSq27tEeiI0WSrSzxEiM8robqm2e1jvYG9KdxzENBaxJACav9oNJkzcOgXyxw1obYOp7ZrffOr4pbN/u6MqK12QdyTav8zHjVK0QJ4VM5sz4XHQtsYgY0CqvePape7VFR0oLwF8DdWD/x7RG9qp1+HqQsX/u5IZh/kigwAWrtTpx9IE9UTe7caKjg3Kb2XSEHhHI3SY8rP4hUxOLl5R3AF8Y9sTUN1Ka/7ruwwh0tip4idMMxmC1br9M/ALOK1/bhlpbVp/767L4gIAAAAHUGaJGxDf/6nhAMc3ZNJSJ5YNYgKCI2AF5/2vBH/AAAADUGeQniFfwGxOsZpcVMAAAALAZ5hdEJ/AElaRmEAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWiZTAhv//6nhAA1IAAAAAtBnoZFESwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEkGbvEmoQWyZTAhv//6nhAA1IQAAAAtBn9pFFSwr/wArYQAAAAkBn/l0Qn8AN6EAAAAJAZ/7akJ/ADegAAAAEkGb4EmoQWyZTAhv//6nhAA1IAAAAAtBnh5FFSwr/wArYQAAAAkBnj10Qn8AN6AAAAAJAZ4/akJ/ADegAAAAEkGaJEmoQWyZTAhv//6nhAA1IQAAAAtBnkJFFSwr/wArYAAAAAkBnmF0Qn8AN6EAAAAJAZ5jakJ/ADehAAAAEkGaaEmoQWyZTAhv//6nhAA1IAAAAAtBnoZFFSwr/wArYQAAAAkBnqV0Qn8AN6AAAAAJAZ6nakJ/ADehAAAAEkGarEmoQWyZTAhv//6nhAA1IQAAAAtBnspFFSwr/wArYAAAAAkBnul0Qn8AN6AAAAAJAZ7rakJ/ADehAAAAEkGa8EmoQWyZTAhv//6nhAA1IAAAAAtBnw5FFSwr/wArYQAAAAkBny10Qn8AN6AAAAAJAZ8vakJ/ADehAAAAEkGbNEmoQWyZTAhv//6nhAA1IQAAAAtBn1JFFSwr/wArYQAAAAkBn3F0Qn8AN6EAAAAJAZ9zakJ/ADegAAAAEkGbeEmoQWyZTAhv//6nhAA1IAAAAAtBn5ZFFSwr/wArYQAAAAkBn7V0Qn8AN6AAAAAJAZ+3akJ/ADegAAAAEUGbuUmoQWyZTAhP//3xAAelAAAB9mWIggAEP/73gb8yy2Q/qsZf2kIaQwADpwvvqFKeT729Y0+BjhAgvUqZ8RGi++J3OJMggLEwwfVVpIWSLUtq8cFtxU0JDyhLYHsL0/U+RLzWfRuAdMCB7FUY5NzOQbYSxYLdfezd7ayLpNAmlBkcAC2EJ+fJ1SlMC50MH/cHUBEfvqhIEB8pFfqzKwvZyjN5rILRGAnB3WfKyetfXz6OMXgk9BAtFdvabKlvmJ3eWTscp404IafjNOfVH+o7pSUu2wNMsZaPPs3rXjKFMCw1ZvNwMGjyCwUvPkJw5XnWx9lDrnupmQ3IleNbVpsrLgATFL9tn4Ff298lUp36lFEIg+TFuT4+I5SaRsZAmjiu2FgXzUNKSpYmAABjRFPxum2Sd2tZFEsjiaBK3MVRFxKrbu0R6IjRZKtLPESIzyuhuqbZ7WO9gb0p3HMQ0FrEkAJq/2g0mTNw6BfLHDWhtg6ntmt986vils3+7oyorXZB3JNq/zMeNUrRAnhUzmzPhcdC2xiBjQKq949ql7tUVHSgvAXwN1YP/HtEb2qnX4epCxf+7khmH+SKDABau1OnH0gT1RN7txoqODcpvZdIQeEcjdJjys/iFTE4uXlHcAXxj2xNQ3Upr/uu7DCHS2KniJ0wzGYLVuv0z8As4rX9uGWltWn/vrsviAkAAAAdQZokbEN//qeEAxzdk0lInlg1iAoIjYAXn/a8Ef8AAAANQZ5CeIV/AbE6xmlxUwAAAAsBnmF0Qn8ASVpGYAAAAAkBnmNqQn8AN6EAAAASQZpoSahBaJlMCG///qeEADUgAAAAC0GehkURLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCG///qeEADUgAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCG///qeEADUgAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAASQZu8SahBbJlMCG///qeEADUhAAAAC0Gf2kUVLCv/ACtgAAAACQGf+XRCfwA3oAAAAAkBn/tqQn8AN6EAAAASQZvgSahBbJlMCG///qeEADUgAAAAC0GeHkUVLCv/ACtgAAAACQGePXRCfwA3oQAAAAkBnj9qQn8AN6EAAAASQZokSahBbJlMCG///qeEADUhAAAAC0GeQkUVLCv/ACtgAAAACQGeYXRCfwA3oAAAAAkBnmNqQn8AN6EAAAASQZpoSahBbJlMCG///qeEADUgAAAAC0GehkUVLCv/ACtgAAAACQGepXRCfwA3oQAAAAkBnqdqQn8AN6AAAAASQZqsSahBbJlMCG///qeEADUhAAAAC0GeykUVLCv/ACthAAAACQGe6XRCfwA3oAAAAAkBnutqQn8AN6EAAAASQZrwSahBbJlMCG///qeEADUgAAAAC0GfDkUVLCv/ACthAAAACQGfLXRCfwA3oQAAAAkBny9qQn8AN6AAAAASQZs0SahBbJlMCGf//p4QAM+AAAAAC0GfUkUVLCv/ACthAAAACQGfcXRCfwA3oAAAAAkBn3NqQn8AN6EAAAASQZt4SahBbJlMCF///oywANCAAAAAC0GflkUVLCv/ACthAAAACQGftXRCfwA3oQAAAAkBn7dqQn8AN6EAAAARQZu5SahBbJlMCE///fEAB6UAAAGdZYiEADP//vbsvgU2FMhQZXnDtMIaADa2jPdLt90QBP4t6NbmjcE/nZGpAxBVVxWzlP8P2JvZiWQ56Kpk/YC7sPRJ9uKbkjLqAovankDiXp87lC1GmbNmqynK3M59YqHXrjAI7/dPBi+zU+3LtHpXM1Ye87P06ACo9W49tOfqK96yQDQPEyaMk+BPzIDtMnBxyDPpMj89qhrlT89a4cDG11KiFZIOm5eM9wUS+K94V87JpcbDY+Lkgekk8ZMibX8EotHqDe1jfhWR4uqAFUXBR7AYP8fkeCqCtroNkCX59M9P320rkEp4oCNQ/9SE12XgBip9qZwApo/hCvTjMxHYGNg/odlPJq1jFoD+8vHiE3pvJ3gsE8gOwBmJ3pQgMJcowBxP8rd8CY02UvfRlrCU6hBAqJ4m3r5wJcazKXDaojFT1AOAQgIx7Q6QSh0k8d6YUfICr5iq4FMH07z1Mjz39/KQKEqoXFXCXh6xiCGuqr9eDofaYNoHPh/Ehy6elrqN0I8dIA1OblzHZRP3aH1OUCwYR/2+tM3KrX/I00AAADHzbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAAglcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAMR10cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAglcAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAKAAAADSAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAIJXAAAEAAABAAAAADCVbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAA8AAAH0gBVxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAAwQG1pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAMABzdGJsAAAAnHN0c2QAAAAAAAAAAQAAAIxhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAKAA0gBIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAANmF2Y0MBZAAM/+EAGWdkAAys2UKHfiIQAAADABAAAAMDwPFCmWABAAZo6+PLIsD9+PgAAAAAGHN0dHMAAAAAAAAAAQAAA+kAAAIAAAAAJHN0c3MAAAAAAAAABQAAAAEAAAD7AAAB9QAAAu8AAAPpAAAfOGN0dHMAAAAAAAAD5QAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAPpAAAAAQAAD7hzdHN6AAAAAAAAAAAAAAPpAAAEvgAAALMAAABdAAAAGwAAAFcAAABxAAAAFQAAABMAAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAKAAAAA8AAAANAAAADQAAACgAAAAPAAAADQAAAA0AAAAoAAAADwAAAA0AAAANAAAAFQAAAfoAAAAhAAAAEQAAAA8AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABUAAAH6AAAAIQAAABEAAAAPAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAVAAAB+gAAACEAAAARAAAADwAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFQAAAaEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguNTEuMTAx\" type=\"video/mp4\" />\n",
       "                 </video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Animate learned policy\n",
    "save_dir='./videos/tensorflow/6_2'\n",
    "env = make_env(env_name)\n",
    "generate_animation(env, agent, save_dir=save_dir)\n",
    "[filepath] = glob.glob(os.path.join(save_dir, '*.mp4'))\n",
    "display_animation(filepath)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "#TODO\n",
    "\n",
    "# Try to run this on another environment of your choice from OpenAI Gym\n",
    "# read the accompanying text and try to enahnce the network using various variants\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Summary\n",
    "\n",
    "In this notebook we saw how to train a DQN agent with experience replay and target networks to play Atari game. If you have access to a GPU, try to train the agent and see how well it plays. We can improve the agent further with many tricks and there are many more papers detailing such attempts. As we go along, we will be implementing many of these variants."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
